﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Infragistics.Win;
using Infragistics.Win.UltraWinGrid;

namespace RDD
{
    public partial class frmAgencia : Form
    {
        private Agencia mAgencia;
        private DataSet dsGridDatos = new DataSet();
        //Propiedad de la forma que indica si se esta insertando una fila
        private bool _Insertando = false;
        public bool Insertando
        {
            get
            {
                return _Insertando;
            }
            set
            {
                _Insertando = value;
                //Dependiendo del estado se habilitan los botones
                cmdBorrar.Enabled = !value;
                cmdInsertar.Enabled = !value;
            }
        }

        public frmAgencia()
        {
            InitializeComponent();
            try
            {
                grdValores.DataSource = dsGridDatos;
                mAgencia = new Agencia(dsGridDatos);
                configurarGrid();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error al iniciar la Pantalla : " + ex.Message);
            }
        }

        #region Enventos del Grid
        private void grdValores_AfterRowInsert(object sender, Infragistics.Win.UltraWinGrid.RowEventArgs e)
        {   //Activar la celda llave primaria
            grdValores.Rows[e.Row.Index].Cells["AgenciaID"].IgnoreRowColActivation = true;
            grdValores.Rows[e.Row.Index].Cells["AgenciaID"].Activation = Activation.AllowEdit;
            grdValores.Rows[e.Row.Index].Cells["AgenciaID"].Activate();
            grdValores.PerformAction(UltraGridAction.EnterEditMode);
            Insertando = true;
        }
        private void grdValores_BeforeRowsDeleted(object sender, Infragistics.Win.UltraWinGrid.BeforeRowsDeletedEventArgs e)
        {
            e.DisplayPromptMsg = false;
            if (!Insertando)
            {
                //Preguntar si desea borrar la fila
                if (MessageBox.Show("Va a eliminar la Agencia : " +
                    grdValores.ActiveRow.Cells["AgenciaID"].Value.ToString() +
                    ". Esta operación es irreversible. ¿Esta seguro de continuar?", "Borrar Usuario",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question,
                    MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    try
                    {
                        mAgencia.AgenciaID = grdValores.ActiveRow.Cells["AgenciaID"].Value.ToString();
                        mAgencia.borrarRegistro();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Ocurrio un error al borrar los datos de la fila : " + ex.Message, "Borrar Usuario", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        e.Cancel = true;
                    }
                }
                else
                {
                    e.Cancel = true;
                }
            }
            else
            {
                MessageBox.Show("No puede borrar un registro que esta insertando.", "Borrar Usuario", MessageBoxButtons.OK, MessageBoxIcon.Information);
                e.Cancel = true;
            }
        }
        private void grdValores_BeforeRowUpdate(object sender, Infragistics.Win.UltraWinGrid.CancelableRowEventArgs e)
        {
            try
            {
                UltraGridRow mFila;
                mFila = grdValores.Rows[e.Row.Index];
                if (validarDatosGrid(mFila))
                {
                    mAgencia.AgenciaID = mFila.Cells["AgenciaID"].Value.ToString();
                    mAgencia.Nombre = mFila.Cells["Nombre"].Value.ToString();
                    //Validar si esta insertando o editando
                    if (Insertando)
                    {
                        mAgencia.insertarRegistro();
                        //Volver a dejar columna de solo lectura
                        grdValores.Rows[e.Row.Index].Cells["AgenciaID"].Activation = Activation.ActivateOnly;
                        Insertando = false;
                    }
                    else
                    {
                        mAgencia.actualizarRegistro();
                    }
                }
                else
                {
                    e.Cancel = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrion un error al salvar los datos de la fila : " + ex.Message,
                    "Actualizar Datos",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                e.Cancel = true;
            }
        }
        private void grdValores_BeforeRowCancelUpdate(object sender, CancelableRowEventArgs e)
        {
            Insertando = false;
        }
        private void grdValores_KeyDown(object sender, KeyEventArgs e)
        {
            //Hacer que el Enter funcione como el TAB
            if (e.KeyCode == Keys.Enter)
            {
                grdValores.PerformAction(UltraGridAction.ExitEditMode, false, false);
                grdValores.PerformAction(UltraGridAction.NextCellByTab, false, false);
                e.Handled = true;
                grdValores.PerformAction(UltraGridAction.EnterEditMode, false, false);
            }
        }
        private void grdValores_Error(object sender, ErrorEventArgs e)
        {
            string tMensaje = "Ocurrio un Error en los datos del Grid. " + e.ErrorText;
            if (e.ErrorType == ErrorType.Data && e.DataErrorInfo.Cell != null)
            {
                ////Error de datos en una celda del grid
                //if (e.DataErrorInfo.Source == DataErrorSource.CellUpdate)
                //{
                //    //El error se produjo actualizando una celda con datos invalidos
                //    switch (e.DataErrorInfo.Cell.Column.Key)
                //    {
                //        //Este grid no tiene validacion a nivel de celda
                //    }
                //}
                //Cancelar el error para que podamos desplegar un mensaje personalizado
                e.Cancel = true;
                MessageBox.Show(this, tMensaje, "Error en el Grid",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion Eventos del Grid

        #region Controles
        private void cmdInsertar_Click(object sender, EventArgs e)
        {
            if (!Insertando)
            {
                //Insertar fila en el grid
                grdValores.DisplayLayout.Bands[0].AddNew();
            }
        }
        private void cmdBorrar_Click(object sender, EventArgs e)
        {
            if (grdValores.ActiveRow != null)
            {
                grdValores.ActiveRow.Delete(false);
            }
        }
        private void cmdActualizar_Click(object sender, EventArgs e)
        {
            //Actualiza los valores del grid
            grdValores.UpdateData();
        }
        private void cmdSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion Controles

        #region Metodos Privados
        private void configurarGrid()
        {
            //Dar formato al grid banda 0 - Usuario
            UltraGridBand banda0 = grdValores.DisplayLayout.Bands["Agencia"];
            banda0.Columns["AgenciaID"].MaxLength = 8;
            banda0.Columns["AgenciaID"].Width = 90;
            banda0.Columns["AgenciaID"].CharacterCasing = CharacterCasing.Upper;
            //Nombre
            banda0.Columns["Nombre"].MaxLength = 32;
            banda0.Columns["Nombre"].Width = 200;

            //Hacer ReadOnly campos de Llave Primaria y Auditoria
            banda0.Columns["AgenciaID"].CellActivation = Activation.ActivateOnly;
        }
        private bool validarDatosGrid(UltraGridRow pFila)
        {
            bool tResultado = true;
            string tMensaje = "";
            string tColumna = "";

            //Validar AgenciaID
            if (pFila.Cells["AgenciaID"].Value.ToString() == "")
            {
                tMensaje = "El ID del Agencia es un valor Obligatorio.";
                tColumna = "AgenciaID";
            }
            else if (pFila.Cells["AgenciaID"].Value.ToString().Length > 10)
            {
                tMensaje = "ID Agencia Inválido. Debe tener máximo 10 caracteres.";
                tColumna = "AgenciaID";
            }
            //Nombre
            else if (pFila.Cells["Nombre"].Value.ToString() == "")
            {
                tMensaje = "El nombre de la agencia es un campo obligatorio.";
                tColumna = "Nombre";
            }
            //Ocurrió un error. Mostrar el mensaje personalizado y activar celda con el error.
            if (tMensaje != "")
            {
                MessageBox.Show("Datos no válidos : " + tMensaje, "Actualizar Datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdValores.ActiveRow.Cells[tColumna].Activate();
                grdValores.PerformAction(UltraGridAction.EnterEditMode);
                tResultado = false;
            }
            return tResultado;
        }
        #endregion Metodos Privados
    }
}
